//
//  FunctionTemplates.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/6/20.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef FunctionTemplates_hpp
#define FunctionTemplates_hpp

#include <stdio.h>
#include <iostream>

template <typename T>//也可以使用template <class T>二者基本用法没有太明显的区别

const T& max(const T& x, const T& y)
{
    return (x > y) ? x : y;
}

class Cents2
{
private:
    int m_cents;
public:
    Cents2(int cents)
    : m_cents(cents)
    {
    }
    
    friend bool operator>(const Cents2 &c1, const Cents2 &c2)
    {
        return (c1.m_cents > c2.m_cents);
    }
    
};

//让我们稍微仔细看看模板参数声明。我们从关键字模板开始 - 这告诉编译器，接下来将会是模板参数的列表。我们将所有参数放在斜角括号内（<>）。要创建模板类型参数，请使用关键字typename或class。在这种情况下，两个关键词之间没有区别，所以您使用的是由您决定的。请注意，如果使用class关键字，则传入的类型实际上不必是类（它可以是基本变量，指针或其他匹配的任何其他类型）。然后你命名你的类型（通常是“T”）。

//如果模板函数使用多个模板类型参数，则它们可以用逗号分隔：
//template <typename T1,typename T2>


//编译器足够聪明，知道它只需要为每组唯一类型参数（每个文件）创建一个模板实例。同样值得注意的是，如果你创建了一个模板函数但是没有调用它，那么就不会创建模板实例。
//编译器说：“哦，我们想调用max（int，int）”。编译器复制函数模板并创建模板实例max（int，int）：
#endif /* FunctionTemplates_hpp */
